package com.baishancloud.log.udf.string;

import com.baishancloud.log.util.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.table.functions.ScalarFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @author ziqiang.wang
 * @date 2022/3/29 18:50
 */
public class SpecificIndexReplace extends ScalarFunction {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpecificIndexReplace.class);

    /**
     * 将给定字符串按照指定分隔字符分割，然后使用指定字符串去替换指定位置的值
     *
     * @param value     待处理字符串
     * @param separator 分隔字符，只可设置为1个字符，如果超过1个字符，则只取第一个字符
     * @param index     要替换的位置下标，证书从0开始，倒数从-1开始
     * @param target    目标字符串
     * @return 使用指定字符串替换掉指定位置值之后的字符串
     */
    public String eval(String value, String separator, int index, String target) {
        if (StringUtils.isEmpty(value)) {
            return value;
        } else {
            char separatorChar = separator.toCharArray()[0];
            List<String> split = StringUtil.split(value, separatorChar);
            int length = split.size();
            if (index < 0) {
                index += length;
            }
            if (index >= length || index < 0) {
                if (index < 0) {
                    index -= length;
                }
                LOGGER.error("被替换字符串出现下标越界，将返回原始字符串。\n原始字符串：" + value + "，指定分隔符：" + separatorChar + "，指定下标：" + index);
                return value;
            }
            split.set(index, target);
            return StringUtils.join(split, separator);
        }
    }

}
